package com.ainge.easystudy.designpattern.singleton;

/**
 * 懒汉式单例模式
 * @author: Ainge
 * @Time: 2021/4/24 15:05
 */
public class LazyDoubleCheckSingleton {

    /**
     * volatile 保证线程可见性
     */
    private static volatile LazyDoubleCheckSingleton singleton;
    // 构造器私有化，但是反射还是可以获取实例
    private LazyDoubleCheckSingleton(){}
    public static LazyDoubleCheckSingleton getInstance(){
        // 第一次检查
        if(singleton == null){
            // 锁住整个类
            synchronized (LazyDoubleCheckSingleton.class){
                // 第二次检查
                if(singleton == null){
                    /**
                     * 1.分配内存给这个对象
                     * 2.初始化对象
                     * 3.设置singleton 指向刚分配的内存地址
                     */
                    singleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return singleton;
    }

}
